from .global_var import *

class BaseTask(object):
    '''
    任务基类，至少包含以下（只读）属性
    - start_pos 任务起点（装货的地方），可以是岸边取货点，也可以是堆场位置 
    - end_pos 任务终点（卸货的地方），可以是堆场位置，也可以是岸边取货点
    - start_time 船只开始停靠的时间，任务的最早结束时间
    - num_of_containers 需要搬运的集装箱数量
    '''
    def __init__(self):
        self._start_pos  = None
        self._end_pos    = None
        self._start_time = None
        self._containers = None
        self._id         = None
        self._status     = Status_Task.Waiting
    
    @property
    def start_pos(self):
        return self._start_pos

    @property
    def end_pos(self):
        return self._end_pos
        
    @property
    def start_time(self):
        return self._start_time

    @property
    def num_of_containers(self):
        return self._containers

    @property
    def id(self):
        return self._id

    @property
    def destination(self):
        return self._end_pos if self._end_pos else self._start_pos
    
    @property
    def status(self):
        return self._status

    @property
    def info(self):
        return {
            'id': self._id,
            'status': self._status.name,
            'load': self.start_pos,
            'unload': self.end_pos,
            'start_time': self.start_time
        }

    def update_status(self, status):
        self._status = status

class Task(BaseTask):
    '''
    任务类，包含以下（只读）属性
    - num_of_containers 需要搬运的集装箱数量
    - start_pos 任务起点（装货的地方），可以是岸边取货点，也可以是堆场位置 
    - end_pos 任务终点（卸货的地方），可以是堆场位置，也可以是岸边取货点
    - start_time 船只开始停靠的时间，任务的最早结束时间
    '''
    def __init__(self, properties: dict):
        super().__init__()
        self._id = properties.get('id' )
        self._start_pos  = properties.get('start_pos' )
        self._end_pos    = properties.get('end_pos') if properties.get('end_pos') else None
        self._containers = properties.get('containers', 1)
        self._start_time = properties.get('start_time')
        # self.priority = properties.get('priority')
    

class Emergency(BaseTask):
    '''
    紧急任务类
    - start_pos 要去的地方
    - start_time 何时启动
    '''
    def __init__(self, task_name, start_pos, start_time):
        super().__init__()
        self._id = task_name
        self._start_pos = start_pos
        self._start_time = start_time
